package org.ciallo.simplemusicplayer.data.dao;

import androidx.lifecycle.LiveData;
import androidx.room.*;
import org.ciallo.simplemusicplayer.data.model.RecentlyPlayedSong;
import org.ciallo.simplemusicplayer.data.model.Song;

import java.util.List;

/**
 * @author Jukomu
 * @Description: RecentlyPlayedSong 的数据访问对象 (DAO)
 * @Package: org.ciallo.simplemusicplayer.data.model
 * @Project: SimpleMusicPlayer
 * @name: PlaylistSongCrossRef
 * @Date: 2025/5/30-00:58
 * @Filename: PlaylistSongCrossRef
 */
@Dao
public interface RecentlyPlayedDao {

    /**
     * 添加或更新一条最近播放记录。
     * 如果歌曲已在最近播放列表中，则更新其 last_played_timestamp。
     * @param recentlyPlayedSong 要添加或更新的记录。
     */
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    void addOrUpdateRecentPlay(RecentlyPlayedSong recentlyPlayedSong);

    /**
     * 获取最近播放的歌曲列表（完整的Song对象），按最后播放时间降序排列，并限制数量。
     * @param limit 要获取的最多歌曲数量。
     * @return LiveData 包装的最近播放歌曲列表 (Song对象)。
     */
    @Transaction // 保证原子性
    @Query("SELECT s.* FROM songs s " +
            "INNER JOIN recently_played_songs rps ON s.id = rps.song_id " +
            "ORDER BY rps.last_played_timestamp DESC " +
            "LIMIT :limit")
    LiveData<List<Song>> getRecentlyPlayedSongsWithDetails(int limit);

    /**
     * 获取所有最近播放记录的数量。
     * @return 最近播放记录的总数。
     */
    @Query("SELECT COUNT(*) FROM recently_played_songs")
    int getRecentPlaysCount();

    /**
     * 获取最旧的一条播放记录的 song_id (用于超过上限时删除)。
     * @return 最旧记录的 songId，如果表为空则返回0或null (查询可能返回0条记录)。
     */
    @Query("SELECT song_id FROM recently_played_songs ORDER BY last_played_timestamp ASC LIMIT 1")
    long getOldestPlayedSongId();

    /**
     * 根据歌曲ID删除一条最近播放记录。
     * @param songId 要删除记录的歌曲ID。
     */
    @Query("DELETE FROM recently_played_songs WHERE song_id = :songId")
    void deleteRecentPlayBySongId(long songId);


    /**
     * 清空所有最近播放记录。
     */
    @Query("DELETE FROM recently_played_songs")
    void clearAllRecentPlays();
}
